package com.test.test11;

import android.os.Environment;
import android.util.Log;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.test.test11.entity.User;

import java.io.File;
import java.io.IOException;
import java.util.Map;

/**
 * 配置类，配置一些程序要用的常量
 */
public class Config {

    private static final String TAG = "CONFIG";

    // 本地配置信息存储路径
    public static final String PWD_FILE = Environment.getExternalStorageDirectory().getAbsolutePath()+"/tsingjia/config";
    // 登录信息存储位置
    public static final String USER_INFO_FILE = PWD_FILE+"/userinfo.json";
    // 存储城市信息的文件
    public static final String WEATHER_FILE = PWD_FILE+"/weatherinfo.json";
    // 存储网络状态，由监听器去监听网路连接情况改变此变量的值，然后其他应用读取该值即可 0-无网络连接，1-wifi，2-不是wifi的网络连接
    // TODO 默认值设置为1，避免出现app未请求到获取网络状态的权限而出现的问题。理论上来说，如果用户未授予权限的话则该值一直是1.是否连接网络通过请求结果判断
    private static volatile int NETWORK = 1;

    /**
     * 设置网络连接
     * @param i
     */
    public static synchronized void setNETWORK(int i){
        NETWORK = i;
    }

    /**
     * 获取当前网络连接状态
     * @return
     */
    public static int getNETWORK(){
        return NETWORK;
    }

    /**
     * 创建本地配置文件所在目录
     * @return 已经存在或者创建成功返回true，返回false表示程序出现问题
     */
    public static boolean generateConfigDir(){
        File file = new File(PWD_FILE);
        if(file.isDirectory()){
            Log.i(TAG, "配置文件目录已经存在，不需要再重新创建");
            return true;
        }
        if(file.exists()){
            Log.e(TAG, "配置文件所在目录已经存在而且不是一个目录，所以程序会报错");
            return false;
        }
        // 创建目录
        return file.mkdirs();
    }

    /**
     * 读取本地用户登录信息
     * @return
     */
    public static User readUserInfo(){
        File userInfoFile = new File(USER_INFO_FILE);
        if(!userInfoFile.exists()){
            Log.i(TAG, "本次不存在用户信息");
            return null;
        }
        try {
            User localUser = (User)readClassFromFile(userInfoFile, User.class);
            return localUser;
        } catch (IOException e) {
            Log.e(TAG, "本地用户信息读取失败");
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将用户信息存入本地
     * @param user
     * @return
     */
    public static boolean storeUserInfo(User user){
        File userInfoFile = new File(USER_INFO_FILE);
        try {
            writeObjectToJsonFile(userInfoFile, user);
            return true;
        } catch (IOException e) {
            Log.e(TAG, "将用户信息写入文件时出错");
            e.printStackTrace();
        }
        return false;
    }



    /**
     * 将参数从json文件中读取出来
     * @param file json文件
     * @return
     * @throws IOException
     */
    private static Map<String, Object> readParamsFromFile(File file) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        return mapper.readValue(file, Map.class);
    }

    /**
     * 将参数写入到文件中去
     * @param file    文件对象
     * @param params  参数
     * @throws IOException
     */
    private static void writeParamsToJsonFile(File file, Map<String, Object> params) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.writeValue(file, params);
    }

    /**
     * 从文件中将某类对应的数据读取
     * @param file 文件
     * @param type  目标数据类型
     * @return
     * @throws IOException
     */
    private static Object readClassFromFile(File file, Class<?> type) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        return mapper.readValue(file, type);
    }

    /**
     * 将某个对象使用json格式化后写到文件中去
     * @param file  文件
     * @param obj   对象
     * @throws IOException
     */
    private static void writeObjectToJsonFile(File file, Object obj) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.writeValue(file, obj);
    }
}
